#include "window_manager.h"
#include "album_play.h"
#include "styles.h"
#include "utils.h"

// ==============================
// 全局变量使用声明
// ==============================

// 注意：这些变量已经在 mywin.c 中定义，这里只需要使用
// 不需要重复定义

// ==============================
// 窗口事件回调函数
// ==============================

/**
 * @brief 关闭窗口事件回调
 * @param e 事件对象
 * 
 * 处理窗口关闭按钮的点击事件
 */
void  close_win_event_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e); // 获取事件类型
    if(code == LV_EVENT_CLICKED) {               // 检查是否为点击事件
        lv_obj_t *win = (lv_obj_t *)lv_event_get_user_data(e); // 获取要关闭的窗口对象
        lv_obj_del(win);                         // 删除窗口对象
        current_win = NULL;                      // 重置当前窗口指针，允许再次创建窗口
        printf("Window closed, current_win reset to NULL\n"); // 输出关闭信息
    }
}

// ==============================
// 界面切换事件回调
// ==============================

/**
 * @brief 相册界面按钮事件回调
 * @param event 事件对象
 * 
 * 处理相册界面中的导航按钮点击事件
 */
void album_btn_event_callback(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event); // 获取事件类型
    int user_data = (int)lv_event_get_user_data(event); // 获取用户数据（目标界面）
    
    if(code == LV_EVENT_CLICKED) {               // 检查是否为点击事件
#if HIDDEN_WIN
        // 隐藏窗口实现（当前未使用）
        lv_obj_add_flag(win2_contanier, LV_OBJ_FLAG_HIDDEN);
        lv_obj_clear_flag(win1_contanier, LV_OBJ_FLAG_HIDDEN);
#else
        if(user_data == 0) {                     // 切换到主界面
            printf("Switching from album to home interface\n"); // 输出切换信息
            album_cleanup();                     // 清理相册资源
            lv_obj_del(album_screen);            // 删除相册界面
            album_screen = NULL;                 // 重置相册界面指针
            show_home_win();                     // 显示主界面
        }
        if(user_data == 2) {                     // 切换到管理界面
            printf("Switching from album to admin interface\n"); // 输出切换信息
            album_cleanup();                     // 清理相册资源
            lv_obj_del(album_screen);            // 删除相册界面
            album_screen = NULL;                 // 重置相册界面指针
            show_admin_win();                    // 显示管理界面
        }
#endif
    }
}

/**
 * @brief 管理界面按钮事件回调
 * @param event 事件对象
 * 
 * 处理管理界面中的导航按钮点击事件
 */
void admin_btn_event_callback(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event); // 获取事件类型
    int user_data = (int)lv_event_get_user_data(event); // 获取用户数据（目标界面）
    
    if(code == LV_EVENT_CLICKED) {               // 检查是否为点击事件
#if HIDDEN_WIN
        // 隐藏窗口实现（当前未使用）
        lv_obj_add_flag(win1_contanier, LV_OBJ_FLAG_HIDDEN);
        lv_obj_clear_flag(win2_contanier, LV_OBJ_FLAG_HIDDEN);
#else
        if(user_data == 0) {                     // 切换到主界面
            printf("Switching from admin to home interface\n"); // 输出切换信息
            lv_obj_del(admin_screen);            // 删除管理界面
            admin_screen = NULL;                 // 重置管理界面指针
            show_home_win();                     // 显示主界面
        }
        if(user_data == 1) {                     // 切换到相册界面
            printf("Switching from admin to album interface\n"); // 输出切换信息
            lv_obj_del(admin_screen);            // 删除管理界面
            admin_screen = NULL;                 // 重置管理界面指针
            show_album_win();                    // 显示相册界面
        }
#endif
    }
}

/**
 * @brief 主界面按钮事件回调
 * @param event 事件对象
 * 
 * 处理主界面中的导航按钮点击事件
 */
void home_btn_event_callback(lv_event_t *event)
{
    lv_event_code_t code = lv_event_get_code(event); // 获取事件类型
    int user_data = (int)lv_event_get_user_data(event); // 获取用户数据（目标界面）
    
    if(code == LV_EVENT_CLICKED) {               // 检查是否为点击事件
#if HIDDEN_WIN
        // 隐藏窗口实现（当前未使用）
        lv_obj_add_flag(win1_contanier, LV_OBJ_FLAG_HIDDEN);
        lv_obj_clear_flag(win2_contanier, LV_OBJ_FLAG_HIDDEN);
#else
        if(user_data == 1) {                     // 切换到相册界面
            printf("Switching from home to album interface\n"); // 输出切换信息
            slideshow_cleanup();                 // 清理幻灯片资源
            lv_obj_del(home_screen);             // 删除主界面
            home_screen = NULL;                  // 重置主界面指针
            show_album_win();                    // 显示相册界面
        }
        if(user_data == 2) {                     // 切换到管理界面
            printf("Switching from home to admin interface\n"); // 输出切换信息
            slideshow_cleanup();                 // 清理幻灯片资源
            lv_obj_del(home_screen);             // 删除主界面
            home_screen = NULL;                  // 重置主界面指针
            show_admin_win();                    // 显示管理界面
        }
#endif
    }
}

// ==============================
// 窗口管理辅助函数
// ==============================

/**
 * @brief 检查是否有窗口打开
 * @return 如果有窗口打开返回true，否则返回false
 * 
 * 检查当前是否有设备控制窗口处于打开状态
 */
bool is_window_open(void)
{
    return current_win != NULL; // 返回窗口打开状态
}

/**
 * @brief 获取当前窗口指针
 * @return 当前打开的窗口指针，如果没有窗口打开则返回NULL
 * 
 * 安全地获取当前窗口指针，用于调试和状态检查
 */
lv_obj_t *get_current_window(void)
{
    return current_win; // 返回当前窗口指针
}

/**
 * @brief 强制关闭所有窗口
 * 
 * 强制关闭所有打开的窗口，用于紧急情况或程序退出时
 */
void force_close_all_windows(void)
{
    if(current_win) { // 检查当前窗口是否存在
        printf("Force closing window: %p\n", current_win); // 输出强制关闭信息
        lv_obj_del(current_win); // 删除窗口对象
        current_win = NULL; // 重置窗口指针
        printf("All windows force closed\n"); // 输出关闭完成信息
    } else { // 如果没有窗口打开
        printf("No windows to close\n"); // 输出提示信息
    }
}

/**
 * @brief 窗口管理器状态查询
 * 
 * 输出窗口管理器的当前状态信息，用于调试
 */
void window_manager_get_status(void)
{
    printf("=== Window Manager Status ===\n"); // 输出状态标题
    
    // 界面状态
    printf("Home Screen: %s\n", home_screen ? "Active" : "Inactive"); // 主界面状态
    printf("Album Screen: %s\n", album_screen ? "Active" : "Inactive"); // 相册界面状态
    printf("Admin Screen: %s\n", admin_screen ? "Active" : "Inactive"); // 管理界面状态
    
    // 窗口状态
    printf("Current Window: %s\n", current_win ? "Open" : "Closed"); // 当前窗口状态
    if(current_win) { // 如果窗口存在
        printf("Window Pointer: %p\n", current_win); // 输出窗口指针
    }
    
    printf("=== End of Status ===\n"); // 输出状态结束标记
}